use super::{Department, Position, Resignation};
use sea_orm_migration::prelude::*;

/// 员工表
#[derive(Iden)]
pub enum Personnel {
    Table,

    /// 员工号
    Id,

    /// 是否在职
    IsEmployed,

    /// 是否在人才库
    IsTalent,

    /// 姓名
    Name,

    /// 性别
    Sex,

    /// 出生日期
    Birthday,

    /// 身份证号
    IdentityNumber,

    /// 入职日期
    EntryDate,

    /// 参加工作日期
    WorkDate,

    /// 用工形式：正式员工 | 临时员工
    Kind,

    /// 人员来源：校园招聘 | 社会招聘 | 其它
    Source,

    /// 部门编号
    DepartmentId,

    /// 岗位编号
    PositionId,

    /// 政治面貌：党员 | 预备党员 | 团员 | 其它
    PoliticalAffiliation,

    /// 民族
    Ethnicity,

    /// 籍贯
    NativePlace,

    /// 联系电话
    PhoneNumber,

    /// 电子邮件
    Email,

    /// 身高
    Stature,

    /// 血型：A | B | AB | O
    BloodGroup,

    /// 婚姻状况：未婚 | 已婚 | 丧偶 | 离婚 | 其它
    MaritalStatus,

    /// 出生地
    Birthplace,

    /// 户口所在地
    Domicile,

    /// 最高学历：高中及以下 | 大专 | 本科 | 研究生
    Education,

    /// 最高学位：无学位 | 学士 | 双学士 | 硕士 | 博士 | 博士后
    Degree,

    /// 毕业院校
    School,

    /// 所学专业
    Major,

    /// 毕业日期
    GraduationDate,

    /// 离职情况ID（弱引用）
    ResignationId,
}

impl Personnel {
    pub fn table() -> TableCreateStatement {
        Table::create()
            .table(Self::Table)
            .if_not_exists()
            .col(ColumnDef::new(Self::Id).big_integer().primary_key())
            .col(
                ColumnDef::new(Self::IsEmployed)
                    .boolean()
                    .default(true)
                    .not_null(),
            )
            .col(
                ColumnDef::new(Self::IsTalent)
                    .boolean()
                    .default(false)
                    .not_null(),
            )
            .col(ColumnDef::new(Self::DepartmentId).integer().not_null())
            .col(ColumnDef::new(Self::PositionId).integer().not_null())
            .col(ColumnDef::new(Self::Name).string().not_null())
            .col(ColumnDef::new(Self::Sex).char_len(1).not_null())
            .col(ColumnDef::new(Self::Birthday).date().not_null())
            .col(ColumnDef::new(Self::IdentityNumber).char_len(18).not_null())
            .col(ColumnDef::new(Self::EntryDate).date().not_null())
            .col(ColumnDef::new(Self::WorkDate).date().not_null())
            .col(ColumnDef::new(Self::Kind).char_len(4).not_null())
            .col(ColumnDef::new(Self::Source).char_len(4).not_null())
            .col(ColumnDef::new(Self::PoliticalAffiliation).char_len(4))
            .col(ColumnDef::new(Self::Ethnicity).string())
            .col(ColumnDef::new(Self::NativePlace).string())
            .col(ColumnDef::new(Self::PhoneNumber).string())
            .col(ColumnDef::new(Self::Email).string())
            .col(ColumnDef::new(Self::Stature).integer())
            .col(ColumnDef::new(Self::BloodGroup).char_len(2))
            .col(ColumnDef::new(Self::MaritalStatus).char_len(2))
            .col(ColumnDef::new(Self::Birthplace).string())
            .col(ColumnDef::new(Self::Domicile).string())
            .col(ColumnDef::new(Self::Education).char_len(5))
            .col(ColumnDef::new(Self::Degree).char_len(3))
            .col(ColumnDef::new(Self::School).string())
            .col(ColumnDef::new(Self::Major).string())
            .col(ColumnDef::new(Self::GraduationDate).date())
            .col(ColumnDef::new(Self::ResignationId).integer())
            .to_owned()
    }

    pub fn in_department() -> ForeignKeyCreateStatement {
        ForeignKey::create()
            .name("FK_personnel_department")
            .from(Self::Table, Self::DepartmentId)
            .to(Department::Table, Department::Id)
            .to_owned()
    }

    pub fn at_position() -> ForeignKeyCreateStatement {
        ForeignKey::create()
            .name("FK_personnel_position")
            .from(Self::Table, Self::PositionId)
            .to(Position::Table, Position::Id)
            .to_owned()
    }

    pub fn has_resignation() -> ForeignKeyCreateStatement {
        ForeignKey::create()
            .name("FK_personnel_resignation")
            .from(Self::Table, Self::ResignationId)
            .to(Resignation::Table, Resignation::Id)
            .to_owned()
    }

    pub fn drop() -> TableDropStatement {
        Table::drop().table(Self::Table).to_owned()
    }
}
